package dao.BankDao;

import common.model.Entity.bankEntity.Account;
import dao.BaseDao;

import java.math.BigDecimal;
import java.util.List;

/**
 * {@code AccountDao} 接口定义了对银行账户实体 {@link Account} 的数据访问操作。
 * <p>
 * 继承自 {@link BaseDao}，提供基础的 CRUD 功能，并扩展了账户相关的查询和更新方法。
 * </p>
 */
public interface AccountDao extends BaseDao<Account, Long> {

    /**
     * 根据用户 ID 查询该用户的所有账户
     *
     * @param userId 用户 ID
     * @return 账户列表
     */
    List<Account> findAccountsByUserId(Long userId);

    /**
     * 根据账户 ID 查询账户
     *
     * @param accountId 账户 ID
     * @return 对应的账户对象，如果不存在可能返回 {@code null}
     */
    Account findAccountById(Long accountId);

    /**
     * 更新指定账户的余额
     *
     * @param accountId  账户 ID
     * @param newBalance 新的余额
     * @return 是否更新成功
     */
    boolean updateBalance(Long accountId, BigDecimal newBalance);

    /**
     * 更新账户名称
     *
     * @param accountId 账户 ID
     * @param newName   新的账户名称
     * @return 是否更新成功
     */
    boolean updateAccountName(Long accountId, String newName);

    /**
     * 删除指定账户
     *
     * @param accountId 账户 ID
     * @return 是否删除成功
     */
    boolean deleteAccount(Long accountId);

    // ⚠️ 内部接口 AccountDAO 与外层接口功能重复，建议删除
    // 如果保留，可以单独加 javadoc
    public interface AccountDAO {
        /**
         * 根据用户 ID 获取账户列表
         *
         * @param userId 用户 ID
         * @return 账户列表
         */
        List<Account> findAccountsByUserId(Long userId);

        /**
         * 根据账户 ID 获取账户
         *
         * @param accountId 账户 ID
         * @return 账户对象
         */
        Account findAccountById(Long accountId);

        /**
         * 更新账户余额
         *
         * @param accountId 账户 ID
         * @param newBalance 新的余额
         * @return 是否更新成功
         */
        boolean updateBalance(Long accountId, BigDecimal newBalance);
    }
}
